#ifndef WEBUI_JSON_H_INCLUDED_
#define WEBUI_JSON_H_INCLUDED_

#include <map>
#include <string>
#include <boost/lexical_cast.hpp>

namespace webui {

class JSON
{
	typedef std::map<std::string,std::string> map_ss_t;
public:
	JSON() {}

	struct LVar
	{
		template<typename T>
		T operator=(const T rhs);

		LVar(map_ss_t& map_,const char* key_) : map(map_), key(key_) {}

		map_ss_t& map;
		const char* key;
	};

	LVar operator[] (const char* key) { return LVar(map_,key); }

	template<typename T>
	JSON(const char* key, T val);

	template<typename T>
	JSON& operator() (const char* key, T val);

	std::string get_json() const;

private:
	map_ss_t map_;
};

template<typename T>
T JSON::LVar::operator=(const T rhs)
{
	map[key]=boost::lexical_cast<std::string>(rhs);
	return rhs;
}

template<typename T>
JSON::JSON(const char* key, T val) : map_()
{
	this->operator()(key,val);
}

template<typename T>
JSON& JSON::operator() (const char* key, T val)
{
	map_[key]=boost::lexical_cast<std::string>(val);
	return *this;
}

} // namespace webui

namespace boost {

template<>
std::string lexical_cast<std::string>(const webui::JSON& json);

} // namespace boost

#endif // WEBUI_JSON_H_INCLUDED_